#ifndef __QpwAccountManager__
#define __QpwAccountManager__

#include <QpwDatabase.h>
#include <QpwNetwork.h>

class QpwAccountData;

class QpwAccount : public QpwXML::Row {
public:
    enum AccessLevels {
        GuestAccessLevel,
        UserAccessLevel,
        AdminAccessLevel,
        DeveloperAccessLevel
    };

    explicit QpwAccount( const QUuid & uuid = QUuid() )
        : Row(uuid), accessLevel(GuestAccessLevel), authorised(false) {}
    virtual ~QpwAccount() {}

    QpwXML::Values values() const;
    void setValues( const QpwXML::Values & values );

    static QString accessLevelName( AccessLevels level );

    QString username;
    QString password;
    AccessLevels accessLevel;
    bool authorised;
    QpwAccountData * data;

};

class QpwAccountManager :
    public QpwXML::DatabaseTemplate<QpwAccount>,
    public QpwNetwork::AccountManager
{
public:
    enum IPCheckType {
        NormalAddress = 0,     //!< принимать все кроме заблокированных
        AllowAllAddress = 1,   //!< принимать все
        BlockAllAddress = 2,   //!< блокировать все, кроме локального
        AllowedOnlyAddress = 3 //!< принимать только из списка разрешенных
    };

    explicit QpwAccountManager( const QString & filePath = QString() );

    bool checkUser( const QString & username, const QString & password );
    bool loginUser( const QString & username, const QString & password );
    void logoutUser( const QString & username );
    bool checkIp( const QHostAddress & address );
    quint32 level( const QString & username );
    QpwAccount * account( const QString & username );

    QList<QHostAddress> allowedIP,
                          blockedIP;

    IPCheckType checkIPType;

};

#endif//__QpwAccountManager__
